##【day13作业】
'''先完成今天课程的模块、包、面向对象的理解和练习，再写以下作业！'''

# 【包、模块】
# 1、总结什么包？模块？
# 包：本质上就是一个文件夹
# 模块：就是py文件，将重复使用的功能代码写入一个py文件里，提供给其他人使用
# 2、总结如何定义一个模块、并调用
# 定义一个模块要新建一个python文件，将函数、变量等写在文件里，供其他文件调用；
# ① from 模块名称(py文件名) import  模块内部的变量/函数/类；
# ② import 模块名称(py文件名)
# 3、总结如何定义一个包、并调用
# 新建一个__init__.py文件夹，可以储存多个.py文件，管理多个模块；
# ①from p1 import m1,m2   导入p1这个包下的m1模块、m2模块
# ②from p1 import *       导入p1这个包下的所有模块

# 【异常处理】
# 1、总结异常处理有什么作用？
# ①只要程序遇到报错了，通过异常处理，不阻塞后续的代码继续执行
# ②无论代码程序报不报错，都需要记录程序执行的过程到日志文件里，方便日后的一个问题排查
# ③为了更加友好的用户体验，自定义友好的异常输出
# 2、总结异常处理的语法结构是什么样的？
# try:
#     print( '存放可能报错的代码块...' )
# except Exception as e1:
#     print('只要报错了，就执行这一段，并捕获报错信息！记录报错的日志信息到日志文件里面去！')
# else:
#     print('不会报错时才会执行的代码！')
#     print('如果代码正常执行，可以利用这个步骤来记录程序执行的日志信息，记录到日志文件里面...')
# finally:
#     print('无论包不报错，都会执行的代码！')
#     print('一般用来释放资源的！')
#【基础练习1】
# 1.创建一个学生类 Student，定义初始化方法__init__()初始化实例属性 name、sex、age、score（成绩列表）
# ，以及类属性class_id=260824、class_name=Ai0824
stu1={'name':'南方宇','sex':'男','age':24,'score':[80,70,60]}
stu2={'name':'北方宇','sex':'女','age':28,'score':[90,100,70]}
class Student:
    class_id = 260824
    class_name='Ai0824'
    def __init__(self,n,s,a,sc):
        self.name=n
        self.sex=s
        self.age=a
        self.score=sc
    def get_stuinfo(self):
        print(self.name,self.sex,self.age,self.score)

    def avg_score(self):
        n=sum(self.score)/len(self.score)
        print(n)

# 2.实例化学生对象stu1、sut2，并挨个访问实例属性以及类属性，查看结果
s1=Student('南方宇','男',24,[80,70,60])
s2=Student('北方宇','女',28,[90,100,70])
print(s1.name,s1.sex,s1.age,s1.score)
print(s2.name,s2.sex,s2.age,s2.score)
print(Student.class_id,Student.class_name)
# 3.定义一个 get_stuinfo() 方法，调用该方法可以返回学生的所有属性
s1.get_stuinfo()
s2.get_stuinfo()
# 4.定义成绩平均分的方法 avg_score() 来计算每个学生的平均分，实例对象调用方法后，返回该学生的平均分
s1.avg_score()
s2.avg_score()
# 【基础练习2】
# 1.创建一个老师类 Teacher，定义初始化方法__init__()初始化实例属性 name、age、project（科目）、salary
# ，有类属性 company = '沃林数智'、boss = ['陈总','廖总']
tea1={'name':'东方宇','age':35,'project':'python','salary':12000}
tea2={'name':'西方宇','age':44,'project':'java','salary':15500}
class Teacher:
    company = '沃林数智'
    boss = ['陈总', '廖总']
    s1 = Student('南方宇', '男', 24, [80, 70, 60])
    s2 = Student('北方宇', '女', 28, [90, 100, 70])
    def __init__(self,n,a,p,s):
        self.name=n
        self.age=a
        self.project=p
        self.salary=s

    def teaching(self, x):
        print(f'{self.name}老师正在使用{x}的方法教学')

# 2.实例化 t1、t2 两个老师实例对象，并访问对应的实例属性和类属性
t1=Teacher('东方宇',35,'python',12000)
t2=Teacher('西方宇',44,'java',15500)
print(t1.name,t1.age,t1.project,t1.salary)
print(t2.name,t2.age,t2.project,t2.salary)
print(Teacher.company,Teacher.boss)
# 3.定义一个 教学方法 teaching(self,x),x接收的是老师的教学方法
# ，实例对象调用时，返回的结果是 f'{xxx}老师正在使用{x}的方法教学...'
t1.teaching('寓教于乐')
t2.teaching('因材施教')
# 4.通过t1.company 调用类属性，然后再进行 t1.company = '沃林牛逼集团'
# ，再次通过类Teacher和t1实例对象分别调用company看看有什么不同？为什么？
print(t1.company)
t1.company = '沃林牛逼集团'
print(t1.company)
print(Teacher.company)
# t1.company被赋值成为'沃林牛逼集团'，是一个实例属性
# Teacher.company保持不变，是一个类属性
# 对实例属性的赋值并不会改变类属性。

# 5.通过t1对象去调用Student类里的get_stuinfo()方法可以吗？测试一下并思考
t1.s1.get_stuinfo()
# 可以，将实例属性s1作为Teacher类里的类属性，可以使用get_stuinfo().
# 6.总结目前学习的面向对象的语法结构框架
class 类名:  # 定义一个类,类的命名都要大写开头
    类属性1:''
    类属性2:211321
    def __init__(self,n,a,s):  # 使用一个初始化方法
        self.name=n
        self.age=a
        self.sex=s   #将参数赋值给属性
    def get_stu_info(self):  # 定义一个方法，用来打印每个对象的属性
        print(self.name,self.sex,self.age)
# 实例化
s1 = 类名('姓名', 30, '男')  # 这个过程叫做实例化，得到的结果叫做示例对象
#调用实例对象的属性
print(s1.name,s1.sex,s1.age)
# 调用实例对象自己的方法
s1.get_stuinfo()